package com.junyi.guava;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.util.Map;

/**
 * guava 的 Table 允许一个 Value 对应两个Key，分别是 rowKey 和 columnKey
 * 主要是替换双层Map的数据结构：Map<String, Map<String, Integer>>
 * @time: 2022/4/7 16:45
 * @version: 1.0
 * @author: junyi Xu
 */
@Slf4j
public class TableMy {


    @Test
    public void test() {
        // 记录每个人在每星期的学习时间
        // 姓名, 星期几, 时间
        HashBasedTable<String, String, Integer> table = HashBasedTable.create();
        table.put("kk", "Monday", 10);
        table.put("kk", "Tuesday", 2);
        table.put("aj", "Monday", 1);
        table.put("aj", "Tuesday", 3);
        log.info("****************************************");

        // 显示每个维度的集合
        log.info("rowKeySet: {}", table.rowKeySet());
        log.info("columnKeySet: {}", table.columnKeySet());
        log.info("values: {}", table.values());
        log.info("****************************************");

        // 统计 key 对应的 Value，下面以 rowKey 为例
        for (String key : table.rowKeySet()) {
            int sum = table.row(key).entrySet().stream().map(t -> t.getValue()).mapToInt(t -> t).sum();
            log.info("{} -> {}", key, sum);
        }
        log.info("****************************************");

        // 转换 rowKey 和 columnKey
        Table<String, String, Integer> transposeTable = Tables.transpose(table);
        transposeTable.cellSet().stream().forEach(t -> {
            log.info("{} - {} - {}", t.getRowKey(), t.getColumnKey(), t.getValue());
        });
        log.info("****************************************");

        // 转换为双层的 Map
        Map<String, Map<String, Integer>> rowMap = table.rowMap();
        log.info("rowMap: {}", rowMap.toString());
        Map<String, Map<String, Integer>> columnMap = table.columnMap();
        log.info("columnMap: {}", columnMap.toString());

    }
}
